home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacUser Mac Bin 36
/
MACUSER-MACBIN36-1996-11.ISO.7z
/
MACUSER-MACBIN36-1996-11.ISO
/
READER'S GALLERY
/
東京都 本多欣亮
/
Bring To Above
/
bring to above.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-06
|
6KB
|
374 lines
/*
**
** bring to above.c
**
*/
/*
#if THINK_C
#include <BDC.h>
#else
#include <Packages.h>
#endif
#include <Errors.h>
#include <Memory.h>
#include <Resources.h>
#include <Script.h>
#include <ToolUtils.h>
*/
#include "AIPluginInterface.h"
#include "bring to above.h"
FXErr
main(AIFilterPB *pb)
{
FXErr error=kNoErr ;
switch(pb->selector) {
case kSelectorPluginInterfaceVersion :
error=DoVersion() ;
break ;
case kSelectorPluginStartUp :
error=DoStartup(pb) ;
break ;
case kSelectorPluginAbout :
error=DoAbout(pb) ;
break ;
case kSelectorGetParameters :
error=DoOption(pb) ;
break ;
case kSelectorGo :
error=DoFilter(pb) ;
break ;
}
ReportError(pb,error) ;
return(error) ;
}
pascal FXErr
DoVersion(void)
{
FXErr error=kPluginInterfaceVersion ;
return(error) ;
}
pascal FXErr
DoStartup(AIFilterPB *pb)
{
AIFunctions *f=pb->functions ;
Handle strings=0 ;
unsigned char *category,*name ;
short total,variation ;
FXErr error=kNoErr ;
strings=Get1Resource('STR#',kFilterSTR_) ;
if(!strings) {
error=ResError() ;
goto err ;
}
MoveHHi(strings) ;
HLock(strings) ;
category=(unsigned char *)*strings ;
total=*(short *)category>>1 ;
category+=sizeof(short) ;
for(variation=0; variation<total; variation++) {
name=category+*category+1 ;
error=f->AddFilter(category,name,variation) ;
if(error) {
goto err ;
}
category=name+*name+1 ;
}
err :
if(strings) {
HUnlock(strings) ;
ReleaseResource(strings) ;
}
return(error) ;
}
pascal FXErr
DoAbout(AIFilterPB *pb)
{
AIFunctions *f=pb->functions ;
DialogPtr dialog=0 ;
short itemHit ;
FXErr error=kNoErr ;
dialog=GetNewDialog(kAboutDLOG,0,(WindowPtr)-1) ;
if(!dialog) {
goto err ;
}
ModalDialog(f->ModalDialogProc,&itemHit) ;
err :
if(dialog) {
DisposeDialog(dialog) ;
}
return(error) ;
}
pascal FXErr
DoOption(AIFilterPB *pb)
{
FXErr error=kNoErr ;
return(error) ;
}
pascal FXErr
DoFilter(AIFilterPB *pb)
{
AIFunctions *f=pb->functions;
AIArtHandle **matches=0 ;
long i,nMatch ;
FXErr error=kNoErr ;
error=CheckSelectedArts(pb,&matches,&nMatch) ;
if(error) {
goto err ;
}
switch(pb->variation) {
case 0: /* bring to above */
for(i=0; i<nMatch; i++) {
AIArtHandle this=(*matches)[i], that ;
long attr ;
HoldSelection(f,this) ;
error=GetTargetArt(f,&this) ;
if(this) {
error=f->GetArtPriorSibling(this,&that) ;
if(that) {
error=f->GetArtUserAttr(that,kArtSelected,&attr) ;
if(!(kArtSelected&attr)) {
f->ReorderArt(this,kPlaceAbove,that) ;
}
}
}
}
break ;
case 1: /* bring to below */
for(i=nMatch-1; i>=0; i--) {
AIArtHandle this=(*matches)[i], that ;
long attr ;
HoldSelection(f,this) ;
error=GetTargetArt(f,&this) ;
if(this) {
error=f->GetArtSibling(this,&that) ;
if(that) {
error=f->GetArtUserAttr(that,kArtSelected,&attr) ;
if(!(kArtSelected&attr)) {
f->ReorderArt(this,kPlaceBelow,that) ;
}
}
}
}
break ;
}
err:
if(matches) {
DisposeHandle((Handle)matches) ;
}
return(error) ;
}
pascal void
ReportError(AIFilterPB *pb,FXErr report)
{
Str255 text ;
Handle strings=0 ;
unsigned char *p ;
short total,index ;
long number ;
FXErr error ;
if(report==kNoErr
|| report==kCanceledErr
|| report==kPluginInterfaceVersion) {
goto err ;
}
strings=Get1Resource('STR#',kErrorSTR_) ;
error=ResError() ;
if(error) {
goto err ;
}
HLock(strings) ;
p=*(unsigned char **)strings ;
total=*(short *)p>>1 ;
p+=sizeof(short) ;
for(index=0; index<total; index++) {
if(*(p+1)=='-'
|| *(p+1)>='0'&&*(p+1)<='9') {
StringToNum(p,&number) ;
} else {
number=*(long *)(p+1) ;
}
p+=*p+1 ;
if(number==report
|| index==total-1) {
break ;
}
p+=*p+1 ;
}
BlockMove(p,text,*p+1) ;
ParamText(text,0,0,0) ;
Alert(kErrorALRT,0) ;
err:
if(strings) {
HUnlock(strings) ;
ReleaseResource(strings) ;
}
}
pascal FXErr
CheckSelectedArts(AIFilterPB *pb,AIArtHandle ***matches,long *nMatch)
{
AIFunctions *f=pb->functions ;
AIMatchingArtSpec spec[4] ;
FXErr error=kNoErr ;
*matches=0 ;
spec[0].type=kPathArt ;
spec[0].whichAttr=kArtSelected ;
spec[0].attr=kArtSelected ;
spec[1].type=kMysteryPathArt ;
spec[1].whichAttr=kArtSelected ;
spec[1].attr=kArtSelected ;
spec[2].type=kPlacedArt ;
spec[2].whichAttr=kArtSelected ;
spec[2].attr=kArtSelected ;
spec[3].type=kTextArt ;
spec[3].whichAttr=kArtSelected ;
spec[3].attr=kArtSelected ;
error=f->GetMatchingArt(spec,4,matches,nMatch) ;
if(error) {
goto err ;
}
if(!*nMatch) {
error=kBadSelectionErr ;
goto err ;
}
err :
if(error&&*matches) {
DisposeHandle((Handle)*matches) ;
}
return(error) ;
}
pascal FXErr
GetTargetArt(AIFunctions *f,AIArtHandle *art)
{
AIArtHandle parent,sibling,child ;
long attr,level ;
short type ;
Boolean groupSelected=true ;
FXErr error=kNoErr ;
error=f->GetArtParent(*art,&parent) ;
error=f->GetArtType(parent,&type) ;
error=GetLevelOfArt(f,parent,&level) ;
if(((type==kGroupArt)||(type==kCompoundPathArt))&&(level>0)) {
error=f->GetArtFirstChild(parent,&child) ;
do {
error=f->GetArtUserAttr(child,kArtSelected,&attr) ;
groupSelected &= (attr&kArtSelected)?true:false ;
error=f->GetArtSibling(child,&child) ;
} while(child) ;
if(groupSelected) {
error=f->GetArtSibling(*art,&sibling) ;
if(sibling) {
*art=nil ;
} else {
*art=parent ;
}
} /* else let *art be */
}
return(error) ;
}
pascal FXErr
GetLevelOfArt(AIFunctions *f,AIArtHandle art,long *level)
{
FXErr error = kNoErr ;
*level = 0 ;
do {
error=f->GetArtParent(art,&art) ;
if(error) art = nil ;
} while(art && ++(*level)) ;
return(error) ;
}
pascal FXErr
HoldSelection(AIFunctions *f,AIArtHandle art)
{
AIArtHandle path ;
short type ;
FixedMatrix matrix ;
FXErr error=kNoErr ;
error=f->GetArtType(art,&type) ;
if(type==kTextArt) {
error=f->GetFirstTextPath(art,&path) ;
if(!error) {
f->GetTextPathMatrix(path,&matrix) ;
f->SetTextPathMatrix(path,&matrix) ;
}
} else {
f->SetArtUserAttr(art,kArtSelected,kArtSelected) ;
}
return(error) ;
}